import numpy as np


def simple_calculate():
  l = [150, 166, 183, 170]
  for i in range(len(l)):
    l[i] += 3
  print(l)

  print(list(map(lambda x: x + 3, [150, 166, 183, 170])))


def numpy_calculate():
  a = np.array([150, 166, 183, 170])
  print("a + 3:", a + 3)
  print("a - 3:", a - 3)
  print("a * 3:", a * 3)
  print("a / 3:", a / 3)


def numpy_analyze():
  a = np.array([150, 166, 183, 170])
  # 计算数组所有元素的总和
  print("a.sum():", a.sum())
  # 计算数组所有元素的平均值
  print("a.mean():", a.mean())
  # 返回数组中的最大值
  print("a.max():", a.max())
  # 返回数组中的最小值
  print("a.min():", a.min())
  # 计算数组元素的标准差
  print("a.std():", a.std())
  # 计算数组元素的方差
  print("a.var():", a.var())
  # 返回最大值的索引位置
  print("a.argmax():", a.argmax())
  # 返回最小值的索引位置
  print("a.argmin():", a.argmin())
  # 返回排序后的索引数组
  print("a.argsort():", a.argsort())
  # 对数组进行原地排序，返回None
  print("a.sort():", a.sort())
  # 数组中元素的总数
  print("a.size:", a.size)
  # 数组的形状，对于一维数组显示元素个数
  print("a.shape:", a.shape)
  # 数组元素的数据类型
  print("a.dtype:", a.dtype)
  # 数组的维度数
  print("a.ndim:", a.ndim)
  # 每个数组元素占用的字节数
  print("a.itemsize:", a.itemsize)
  # 数组占用的总字节数
  print("a.nbytes:", a.nbytes)
  # 检查数组中所有元素是否都为True(非零)
  print("a.all():", a.all())
  # 检查数组中是否有任意元素为True(非零)
  print("a.any():", a.any())
  # 返回数组中非零元素的索引
  print("a.nonzero():", a.nonzero())


def numpy_transpose():
  a = np.array([1, 2, 3, 4, 5, 6])
  # 使用 np.newaxis 将一维数组转换为二维数组，增加一个新的轴
  # np.newaxis 是 None 的别名，用于在指定位置添加新的维度
  a_2d = a[np.newaxis, :]  # 在第0轴添加新维度，将(6,)形状变为(1, 6)
  # 第二个参数 ':' 表示保留原数组的所有列，即选择所有元素
  # 这样就将一维数组 [1, 2, 3, 4, 5, 6] 转换为二维数组 [[1, 2, 3, 4, 5, 6]]
  # 结果是一个1行6列的二维数组
  print("原数组a的形状:", a.shape, "转换后a_2d的形状:", a_2d.shape)
  print("原数组a:", a)
  print("转换后a_2d:\n", a_2d)
  
  # 展示另一种使用 reshape 方法实现相同效果的方式
  a_2d_alt = a.reshape(1, -1)  # -1 表示自动推断该维度的大小
  print("使用reshape方法转换后的形状:", a_2d_alt.shape)

  a_none = a[:, None]
  a_expand = np.expand_dims(a, axis=1)
  print("使用None添加维度后的形状:", a_none.shape, "使用expand_dims添加维度后的形状:", a_expand.shape)
  print("使用None添加维度后的数组:", a_none, "\n使用expand_dims添加维度后的数组:", a_expand)

if __name__ == '__main__':
  numpy_transpose()
